﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using NHibernate;
using EmpleadosSOAPServices.Dominio;

namespace EmpleadosSOAPServices.Persistencia
{
    public class EmpleadoDAO : BaseDAO<Empleado, int>
    {
        public Empleado ObtenerEmpleadoDisponible(string cargo)
        {
            Empleado empleadoEncontrado = null;
            string sql = "SELECT TOP 1 * FROM empleado e where e.IdCargo = @cargo and e.Estado = @estado ORDER BY NEWID ()";
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerConexion()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {

                    com.Parameters.Add(new SqlParameter("@cargo", cargo));
                    com.Parameters.Add(new SqlParameter("@estado", "SDISP"));
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        if (resultado.Read())
                        {
                            empleadoEncontrado = new Empleado();
                            empleadoEncontrado.IdEmpleado = (int)resultado["IdEmpleado"];
                            empleadoEncontrado.IdCargo = (string)resultado["IdCargo"];
                            empleadoEncontrado.IdUnidad = (int)resultado["IdUnidad"];
                            empleadoEncontrado.Apellidos = (string)resultado["Apellidos"];
                            empleadoEncontrado.Nombres = (string)resultado["Nombres"];
                            empleadoEncontrado.TipoDocumento = (string)resultado["TipoDocumento"];
                            empleadoEncontrado.NroDocumento = (string)resultado["NumeroDocumento"];
                            empleadoEncontrado.Estado = (string)resultado["Estado"];
                            empleadoEncontrado.Email = (DBNull.Value.Equals(resultado["Email"])) ? "" : (string)resultado["Email"];
                            empleadoEncontrado.Direccion = (string)resultado["Direccion"];
                            empleadoEncontrado.Telefono = (string)resultado["Telefono"];
                            empleadoEncontrado.FechaNacimiento = (DateTime)resultado["FecNacimiento"];
                        }

                    }

                }
            }

            return empleadoEncontrado;
        }

        public Empleado ObtenerUnidadAsignaEmpleado(int IdUnidad)
        {

            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                string sentenciaSQL = "select d1 from Empleado d1 where d1.IdUnidad = :IdUnidad";
                IQuery query = sesion.CreateQuery(sentenciaSQL);
                query.SetParameter("IdUnidad", IdUnidad);
                IList<Empleado> lista = query.List<Empleado>();
                if ((lista == null) || (lista.Count == 0))
                {
                    return null;
                }
                return lista[0];
            }

        }


        public Empleado ObtenerPorDNI(Empleado emplvalidadni)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                string sentenciaSQL = "select d1 from Empleado d1 where d1.NroDocumento = :NumeroDocumento and d1.IdEmpleado <> :IdEmpleado";
                IQuery query = sesion.CreateQuery(sentenciaSQL);
                query.SetParameter("NumeroDocumento", emplvalidadni.NroDocumento);
                query.SetParameter("IdEmpleado", emplvalidadni.IdEmpleado);
                IList<Empleado> lista = query.List<Empleado>();
                if ((lista == null) || (lista.Count == 0))
                {
                    return null;
                }
                return lista[0];
            }
        }


        public int ObtenerEdad(DateTime fechanacimiento)
        {

            int edad = 0;
            string sql = "select DATEDIFF(year, @FecNacimiento, GETDATE()) as Edad";
            using (SqlConnection con = new SqlConnection(ConexionUtil.ObtenerConexion()))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@FecNacimiento", fechanacimiento));

                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        if (resultado.Read())
                        {
                            edad = (int)resultado["Edad"];
                        }

                    }

                }
            }

            return edad;


        }


        public List<Empleado> ListarEmpleadosFiltros(Empleado empleadofiltro)
        {
            using (ISession sesion = NHibernateHelper.ObtenerSesion())
            {
                string sentenciaSQL = "select d1 from Empleado d1 where d1.IdCargo = :IdCargo and d1.Estado = :Estado";
                IQuery query = sesion.CreateQuery(sentenciaSQL);
                query.SetParameter("IdCargo", empleadofiltro.IdCargo);
                query.SetParameter("Estado", empleadofiltro.Estado);
                IList<Empleado> lista = query.List<Empleado>();
                if ((lista == null) || (lista.Count == 0))
                {
                    return null;
                }
                return lista.ToList();
            }
        }


    }
}